#include<iostream>
#include<string.h>
#include<cstdio>
#include<error.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

int main()
{
    pid_t id = fork();
    if (id < 0)
    {
        printf("errno: %d, errstring: %s\n", errno, strerror(errno));
        return errno;   
    }
    else if (id == 0) 
    {
        int cnt = 3;
        while (cnt)
        {
            printf("子进程运行中, pid: %d\n", getpid());
            sleep(1);
            cnt--;
        }

        exit(1); //设置退出码为1
    }
    else 
    {
        //父进程
        //pid_t rid = wait(nullptr);
        //pid_t rid = waitpid(-1, nullptr, 0); // == wait
        int status = 0;
        pid_t rid = waitpid(id, &status, 0); //返回给父进程的本身就是子进程的pid
        if (rid > 0) 
        {
            if (WIFEXITED(status))
            {//程序正常退出
                printf("wait sub process success, rid: %d, status code: %d\n", rid, WEXITSTATUS(status));//打印退出码
            }
        } 
        else 
        {
            perror("child process quit error\n"); //等待失败的情况
        }
        while(true)
        {
            printf("我是父进程：pid: %d\n", getpid());
            sleep(1);
        }
    }
    return 0;
}








//void func()
//{
//    std::cout << "hello word" << std::endl;
//    _exit(23);
//}
//
//int main()
//{
//    func();
//    std::cout << "进程正常退出!" << std::endl;
//    return 0;
//}









//int main()
//{
//    for (int i = 0; i < 200; i++)
//    {
//        std::cout << "code: " << i << ",errstring: " << strerror(i) << std::endl; 
//    }
//}








//int main()
//{
//    printf("before: errno: %d, errstring: %s\n", errno, strerror(errno));
//
//    FILE *fp = fopen("./log.txt", "r");
//    if (fp == NULL)
//    {
//        printf("after: errno: %d, errsting: %s\n", errno, strerror(errno));
//        return errno;
//    }
//    return 10;
//}
